module klang.klang.转换工厂.声明转换.Klang声明转换_;
import 全局;
import std.functional: ·fd = toDelegate;
import ··类型_ = klang.编译.类型.类型_;
import ··节点_ = klang.编译.语法节点.节点_;
import klang.编译.类型.类型_: 转换上下文_, 转换函数_, 输出解析器_, 转换支持_, 基工厂_ = 节点工厂_, 程序主机接口_;
import klang.编译.语法节点.节点_: 基础节点_ = 节点_, 基础源文件_ = 源文件_;
import klang.klang.语法节点.Klang节点_: 源文件_ = Klang源文件_, 语句_, 版本语句_, 表达式_, 符号引用表达式_, 前缀一元表达式_, 二元表达式_;
import klang.klang.检查.klang检查_: Klang转换支持_;
import klang.klang.类型.klang类型_: KSK, 编译选项_, 节点标志_;
import klang.编译.核心.核心_: 词典_, 整数_, 创建数组, 返回零值, 映射, 循环每个, 最小, 获取正规文件名函数_, 查找索引, 结尾包含;
import klang.编译.节点访问.访问节点_: Visitor, visitNode, visitNodes;
import klang.klang.节点访问.Klang节点访问_: visitEachChild;
import klang.klang.节点工厂.Klang工厂_: 节点工厂标志_, 节点工厂_ = Klang节点工厂_;
import klang.klang.转换工厂.转换工具.Klang转换工具_: 获取输出文件名;
源文件_ 当前源文件;
转换上下文_ 当前上下文;
输出解析器_ 输出解析;
Klang转换支持_ 检查;
编译选项_ 编译选项;
词典_!(dstring) 定义词典;
节点工厂_ 工厂;
程序主机接口_ 主机;
static this() {
    定义词典 = new 词典_!(dstring)();
}
转换函数_!(基础节点_) 声明转换(转换上下文_ ct) {
    .当前上下文 = ct;
    .输出解析 = 当前上下文.getEmitResolver();
    .工厂 = new 节点工厂_(节点工厂标志_.无_, 节点标志_.Synthesized);
    .检查 = (cast(Klang转换支持_)(输出解析.获取输出转换支持()));
    .主机 = 输出解析.获取主机();
    .编译选项 = (cast(编译选项_)(主机.获取编译选项()));
    dstring[] 定义 = 编译选项.定义;
    if ((定义 !is ··null!(dstring[])) && 定义.length > 0) {
        foreach (dstring ev; 定义) {
            定义词典.p·设置(ev, ev);
        }
    }
    return cast(转换函数_!(基础节点_))(·fd(&.转换));
}
基础节点_[] 转换(基础节点_ n) {
    源文件_ s = (cast(源文件_)((cast(基础源文件_)(n))));
    .当前源文件 = s;
    源文件_ 结果 = .转换源文件(s);
    if (结果 !is ··null!(源文件_)) {
        结果.输出文件名 = 获取输出文件名(结果, .主机, .编译选项, ".d.k"d);
        return [结果];
    }
    return ··null!(基础节点_[]);
}
源文件_ 转换源文件(源文件_ n) {
    ··节点_.节点数组_!(基础节点_) 语句组 = visitNodes!(基础节点_)(n.语句组, cast(Visitor)(·fd(&.访问语句)));
    if ((语句组 !is null) && (语句组.原型 !is ··null!(基础节点_[])) && 语句组.length > 0) {
        return 工厂.更新源文件(n, 语句组);
    }
    return ··null!(源文件_);
}
基础节点_ 访问语句(基础节点_ n) {
    return visitEachChild!(基础节点_)(n, cast(Visitor)(·fd(&.访问语句)), .工厂);
}
